package co.com.jtune.view.tableModel;

import java.lang.reflect.InvocationTargetException;

import javax.swing.ListModel;

import org.apache.commons.beanutils.PropertyUtils;
import org.jdesktop.application.ResourceMap;

import co.com.jtune.model.TrackModel;

import com.jgoodies.binding.adapter.AbstractTableAdapter;

public class TrackTableModel extends AbstractTableAdapter<TrackModel>{

	private static final long serialVersionUID = 1L;
	
	private String[] columns;
	private ResourceMap resource;
	
	public TrackTableModel (ListModel<TrackModel> listModel, String[] columns, ResourceMap resource)
	{
		super(listModel, columNames(columns, resource));
        this.columns = columns;
        this.resource = resource;
	}
	
    public static String[] columNames(String[] columns, ResourceMap resource) {
    	String names [] = new String[columns.length];
    	for(int i = 0; i < columns.length; i++) {
    		names[i] = resource.getString(columns[i]);
    		if (names[i] == null) {
    			names[i] = "S/N";
    		}
    	}
    	return names;
    }
	
	public Object getValueAt(int rowIndex, int columnIndex) {
		TrackModel model = getRow(rowIndex);
        return eval(model, columnIndex);
	}
	
	protected Object eval(TrackModel model, int columIndex) {
    	String column = columns[columIndex];
    	String path[] = column.split("\\.");
    	if (path.length == 1) {
    		Object value = obtenerValorDefault(model, column);
    		if (value instanceof Boolean) {
    			return resource.getString(value.toString());
    		} else {
    			return value;
    		}
    	} else {
    		Object object = model;
    		for (String property : path) {
    			if (object != null) {
    				object = obtenerValorDefault(model, property);
    			} else {
    				break;
    			}
    		}
    		return object;
    	}
    }
	
	/**
	 * Obtienen el valor de una propiedad de un objeto mediando el uso de reflextion
	 * @param model Objeto que contiene la propiedad.
	 * @param property nombre de la propiedad.
	 * @return El valor de la propiedad.
	 */
	public Object obtenerValorDefault(Object model, String property) {
		Object valor = "";
		try {
			valor = PropertyUtils.getProperty(model, property);
		} catch (IllegalAccessException e) {
//			Logger.getLogger911().error(
//					"No se tuvo acceso a la propiedad " + property
//					+ " de la clase " + model.getClass().toString(), e);
		} catch (InvocationTargetException e) {
//			Logger.getLogger911().error(
//					"No se pudo invocar a la propiedad " + property
//					+ " de la clase " + model.getClass().toString(), e);
		} catch (NoSuchMethodException e) {
//			Logger.getLogger911().error(
//					"La clase" + model.getClass().toString()
//					+ " no tiene el setter para la propiedad "
//					+ property, e);
		}
		return valor;
	}

}
